import java.util.Scanner;

public class demo01 {
//    【问题描述】：给定一个n*n的棋盘，棋盘中有一些位置不能放皇后。
//    现在要向棋盘中放入n个黑皇后和n个白皇后，使任意的两个黑皇后都不在同一行、同一列或同一条对角线上，
//    任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法？n小于等于8。
//    【输入格式】：输入的第一行为一个整数n，表示棋盘的大小。接下来n行，每行n个0或1的整数，
//    如果一个整数为1，表示对应的位置可以放皇后，如果一个整数为0，表示对应的位置不可以放皇后。
//    【输出格式】：输出一个整数，表示总共有多少种放法。
//    【样例输入1】：4
//                1 1 1 1
//                1 1 1 1
//                1 1 1 1
//                1 1 1 1
//    【样例输出1】：2
//    【样例输入2】：4
//                1 0 1 1
//                1 1 1 1
//                1 1 1 1
//                1 1 1 1
//     【样例输出2】：0

    public static int[][] arr;
    public static int Hei = 2;//黑皇后
    public static int Bai = 3;//白皇后
    public static int[] arr1;//黑皇后的位置
    public static int[] arr2;//白皇后的位置
    static int count = 0;
    public static void dfs(int color, int[] address, int row) {
        if (row == address.length) {//等于最后一行，表示皇后放置完成
            if (color == Hei) {
                dfs(Bai, arr2, 0);//放置白皇后
            } else {
                count++;//黑皇后放置完后放置白皇后，颜色变为白皇后代表
                //白皇后全部放完
            }
            return;

        }
        for (int i = 0; i < arr1.length; i++) {
            //address为皇后位置，row
            if (arr[row][i] == 1 && check(address, row, i)) {
                address[row] = i;//放皇后
                arr[row][i] = color;//放黑皇后或白皇后
                dfs(color, address, row + 1);//row+1，寻找下一列
                arr[row][i] = 1;
                //回溯
            }
        }
    }
    //row为当前列
    private static boolean check(int[] address, int row, int col) {
        for (int j = 0; j < row; j++) {
            if (address[j] == col) return false;//列相同
            if (address[j] + j == row + col) return false;//副对角线
            if (address[j] - j == col - row) return false;//正对角线
        }
        return true;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        arr = new int[n][n];//棋盘
        //输入棋盘
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = sc.nextInt();
            }
        }
        arr1 = new int[n];
        arr2 = new int[n];
        dfs(Hei, arr1, 0);//先放置黑皇后
        System.out.println(count);
    }

}